package com.aizuda.boot.modules.business.template.utils;

import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 字段编码生成器
 * 用于生成模板字段的编码，格式为ext1、ext2等
 * 
 * @author system
 * @date 2024-01-01
 */
@Component
public class FieldCodeGenerator {

    /**
     * 字段编码前缀
     */
    private static final String FIELD_CODE_PREFIX = "ext";

    /**
     * 为模板字段生成编码列表
     * 
     * @param fieldCount 字段数量
     * @return 生成的字段编码列表
     */
    public static List<String> generateFieldCodes(int fieldCount) {
        return java.util.stream.IntStream.range(1, fieldCount + 1)
                .mapToObj(i -> FIELD_CODE_PREFIX + i)
                .collect(Collectors.toList());
    }

    /**
     * 生成下一个字段编码
     * 
     * @param existingCodes 已存在的字段编码集合
     * @return 下一个可用的字段编码
     */
    public static String generateNextFieldCode(Set<String> existingCodes) {
        int nextIndex = 1;
        String nextCode = FIELD_CODE_PREFIX + nextIndex;
        
        while (existingCodes.contains(nextCode)) {
            nextIndex++;
            nextCode = FIELD_CODE_PREFIX + nextIndex;
        }
        
        return nextCode;
    }

    /**
     * 批量生成字段编码，避免与已存在的编码冲突
     * 
     * @param fieldCount 需要生成的字段数量
     * @param existingCodes 已存在的字段编码集合
     * @return 生成的字段编码列表
     */
    public static List<String> generateFieldCodes(int fieldCount, Set<String> existingCodes) {
        List<String> newCodes = new java.util.ArrayList<>();
        int currentIndex = 1;
        
        while (newCodes.size() < fieldCount) {
            String code = FIELD_CODE_PREFIX + currentIndex;
            if (!existingCodes.contains(code)) {
                newCodes.add(code);
            }
            currentIndex++;
        }
        
        return newCodes;
    }

    /**
     * 验证字段编码格式是否正确
     * 
     * @param fieldCode 字段编码
     * @return 是否符合格式要求
     */
    public static boolean isValidFieldCode(String fieldCode) {
        if (fieldCode == null || fieldCode.trim().isEmpty()) {
            return false;
        }
        
        // 检查是否以ext开头，后面跟数字
        return fieldCode.matches("^ext\\d+$");
    }

    /**
     * 从字段编码中提取数字
     * 
     * @param fieldCode 字段编码
     * @return 提取的数字，如果格式不正确则返回-1
     */
    public static int extractNumber(String fieldCode) {
        if (!isValidFieldCode(fieldCode)) {
            return -1;
        }
        
        try {
            return Integer.parseInt(fieldCode.substring(FIELD_CODE_PREFIX.length()));
        } catch (NumberFormatException e) {
            return -1;
        }
    }
} 